package org.ccay.manage.security.service;

import java.util.List;
import java.util.Map;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.ccay.core.base.BatchVO;
import org.ccay.core.base.PageVO;
import org.ccay.core.base.PagedResult;
import org.ccay.core.exception.ApplicationException;
import org.ccay.security.annotation.SecurityBindingURL;
import org.ccay.security.annotation.SecurityOperation;
import org.ccay.security.annotation.SecurityResource;
import org.ccay.security.entity.Role;
import org.ccay.security.vo.RoleVO;

@Path("/roleManage")
@Produces("application/json")
@SecurityResource(code="roleManagement",name="系统管理|用户及权限管理|角色管理")
public interface IRoleManageService {
	
	@SecurityOperation(code="page",name="页面权限")
	@SecurityBindingURL("/security/role/roleList.html")
	String roleManagement = "ROLE_MANAGEMENT";
	
	/**
	 * 获取角色
	 * @param userId
	 * @return
	 */
	@GET
	@Path("/findRoleById/{roleId}")
	Role findRoleById(@PathParam("roleId") Long roleId);
	
	/**
	 * 获取角色
	 * @param roleName
	 * @return
	 */
	@GET
	@Path("/findRoleByName/{roleName}")
	Role findRoleByName(@PathParam("roleName") String roleName);
	
	
	/**
	 * 获取角色列表
	 * @param role
	 * @param page
	 * @return
	 */
	@GET
	@Path("/list/page/{pageSize}/{curPage}")
	@SecurityOperation(code="query",name="查询角色")
	PagedResult<RoleVO> findPagedRoles(@QueryParam("")RoleVO role,@PathParam("")PageVO page);
	
	
	/**
	 * 通过多个ID获取角色列表
	 * @param role
	 * @param page
	 * @return
	 */
	@POST
	@Path("/list")
	@SecurityOperation(code="query",name="查询角色")
	List<RoleVO> findRoleByIds(List<Long> roleIds);

	/**
	 * 创建角色
	 * @param role
	 */
	@POST
	@Path("/createRole")
	@SecurityOperation(code="create",name="创建角色")
	void createRole(Role role);
	
	/**
	 * 更新角色
	 * @param role
	 */
	@PUT
	@Path("/updateRole")
	@SecurityOperation(code="update",name="更新角色")
	void updateRole(Role role);
	
	/**
	 * 检查角色是否被引用
	 * @param roleId
	 * @return
	 */
	@GET
	@Path("/checkReferenced/{roleId}")
	Boolean checkReferenced(@PathParam("roleId") Long roleId);
	
	/**
	 * 检查角色名是否存在
	 * @param roleId
	 * @return
	 */
	@GET
	@Path("/checkRolenameUnique")
	Boolean checkRolenameUnique(@QueryParam("roleName")String roleName,@QueryParam("roleId")Long roleId);
	
	
	/**
	 * 批量操作角色
	 * @param batchItems
	 * @throws ApplicationException
	 */
	@PUT
	@Path("/batch")
	void batchOperation(BatchVO<RoleVO> batchItems);
	
	/**
	 * 删除角色，并级联删除引用
	 * @param roleId
	 */
	@DELETE
	@Path("/delRoleCascade/{roleId}")
	@SecurityOperation(code="delRoleCascade",name="删除角色")
	void delRoleCascade(@PathParam("roleId") Long roleId);
	
	/**
	 * 删除角色,当角色被引用是报错
	 * @param roleId
	 */
	@DELETE
	@Path("/delRole/{roleId}")
	@SecurityOperation(code="delRoleCascade",name="删除角色")
	void delRole(@PathParam("roleId") Long roleId);
	
	
	/**
	 * 批量操作校验
	 * @param batchItems
	 * @return
	 */
	@PUT
	@Path("/validateForBatch")
	Map<String, Object> validateForBatch(BatchVO<RoleVO> batchItems);


	/**
	 * 批量创建
	 * @param items2Create
	 */
	@POST
	@Path("/createRoles")
	@SecurityOperation(code="create",name="创建角色")
	void createRoles(List<RoleVO> items2Create);


	/**
	 * 批量更新
	 * @param items2Update
	 */
	@PUT
	@Path("/updateRoles")
	@SecurityOperation(code="update",name="更新角色")
	void updateRoles(List<RoleVO> items2Update);

	/**
	 * 批量级联删除
	 * @param items2Delete
	 */
	@DELETE
	@Path("/deleteRolesCascade/{roleId}")
	@SecurityOperation(code="delRoleCascade",name="删除角色")
	void deleteRolesCascade(List<RoleVO> items2Delete);
	
}
